#include "Vecteur.h"

Vecteur::Vecteur() : Point() 
{
	w=0;
}

Vecteur::Vecteur(float x, float y, float z) : Point(x, y, z) 
{
	w=0;
}

Vecteur::Vecteur(Point p) : Point(p) 
{
	w=0;
}

Vecteur::Vecteur(Point a, Point b)
{
	x = b.x - a.x;
	y = b.y - a.y;
	z = b.z - a.z;
	w=0;
}

void Vecteur::afficher(std::ostream &flux) const 
{
    flux << "(" << x << ", " << y << ", " << z << ", w:" << w << ")";
}
    
float & Vecteur::operator[] (unsigned i)
{
    switch (i) {
        case 0 : return x;
        case 1 : return y;
        case 2 : return z;
        default : return w;
    }
}

float Vecteur::pScalaire (Vecteur v)
{
    return x*v.x + y*v.y + z*v.z;
}

Vecteur Vecteur::pVectoriel(Vecteur v)
{
    return Vecteur (y*v.z - z*v.y, z*v.x - x*v.z,  x*v.y - y*v.x);
}


float Vecteur::longueur() const{
	
	return sqrtf(x*x + y*y + z*z);
}

Vecteur Vecteur::plus(Vecteur v)
{
    return Vecteur (x+v.x, y+v.y, z+v.z);
}

Vecteur Vecteur::operator+(Vecteur v) 
{
	return Vecteur (x+v.x, y+v.y, z+v.z);
}

	
Vecteur& Vecteur::operator+= (Vecteur v) 
{
	x+=v.x;
	y+=v.y;
	z+=v.z;
	return *this;
}

	
	
Vecteur& Vecteur::operator-= (Vecteur v) 
{
	x-=v.x;
	y-=v.y;
	z-=v.z;
	return *this;
}


Vecteur Vecteur::operator-(Vecteur v) const
{
	return Vecteur (x-v.x, y-v.y, z-v.z);
}


Vecteur Vecteur::moins(Vecteur v)
{
        return Vecteur (x-v.x, y-v.y, z-v.z);
}


float Vecteur::cos(Vecteur v)
{
	return  (pScalaire(v)) / sqrtf((x*x+y*y+z*z)*(v.x*v.x+v.y*v.y+v.z*v.z ));
}
	   
void Vecteur::normer()
{
    float norme = sqrtf(x*x + y*y + z*z);
	if(norme != 0 && norme != 1) {
		x /= norme;
		y /= norme;
		z /= norme;
	}
}

Vecteur Vecteur::operator-()
{
	return Vecteur(-x, -y, -z);
}

float operator*(Vecteur v1, Vecteur v2) 
{
	return v1.pScalaire(v2);
}

Vecteur operator*(Vecteur v, float f)
{
	return Vecteur(v.x*f, v.y*f, v.z*f);
}

Vecteur operator*(float f, Vecteur v)
{
	return Vecteur(v.x*f, v.y*f, v.z*f);
}



Vecteur operator/(Vecteur v, float f)
{
	return Vecteur(v.x/f, v.y/f, v.z/f);
}

Vecteur operator/(float f, Vecteur v)
{
	return Vecteur(v.x/f, v.y/f, v.z/f);
}


/**
* renvoie un vecteur perpendiculaire au vecteur courant
*/
Vecteur Vecteur::perpendiculaire()
{
	if (x!= 0 || y!=0)
		return Vecteur(-y, x, 0);
	return Vecteur(-z, 0, x);
}